package com.unsins.core.service;

import java.io.Serializable;
import java.util.List;
import java.util.Map;

import org.springframework.dao.DataAccessException;

import com.unsins.core.exception.ObjectNotFoundException;

/**
 * 数据基础服务类.去掉dao层,因为在DAO层.spring已经做了太多工作.如果增加DAO层,意义不到,而且DAO层显得很贫血.
 * 
 * @author odpsoft
 * 
 * @createdate 2008-10-30
 * @reviewer
 */
public interface IBaseService {
	/**
	 * 通过可序列化ID获取数据实体,该方法会存储介质中获取数据实体.
	 * 
	 * @author odpsoft
	 * @time 2008-10-30
	 * @param clazz
	 *            数据实体对应的领域模型
	 * @param id
	 *            可序列化的ID
	 * @return 如果存在该ID的数据实体,就返回实例化的指定的Class,反之为null.
	 */
	public Object getDomainEntity(Class clazz, Serializable id) throws ObjectNotFoundException;

	/**
	 * 通过可序列化ID获取数据实体,该对象已经存在于session中, 如果需要判断该数据实体是否存在,请使用getDomainEntity方法
	 * 
	 * @author odpsoft
	 * @time 2008-10-30
	 * @param clazz
	 *            数据实体对应的领域模型
	 * @param id
	 *            可序列化的ID
	 * @return 如果存在该ID的数据实体,就返回实例化的指定的Class,反之为null.
	 */
	public Object loadDomainEntity(Class clazz, Serializable id) throws ObjectNotFoundException;

	/**
	 * 通过可序列化ID删除数据实体
	 * 
	 * @author odpsoft
	 * @time 2008-10-30
	 * @param clazz
	 *            数据实体对应的领域模型
	 * @return 如果存在该ID的数据实体,就返回实例化的指定的Class,反之为null.
	 */
	public void removeDomainEntity(Object clazz) throws DataAccessException;

	/**
	 * 
	 * 根据ID删除数据
	 * 
	 * @author odpsoft
	 * @time 2008 2008-10-30
	 * @param clazz
	 *            数据定义模型
	 * @param id
	 *            数据ID
	 * @throws DataAccessException
	 */
	public void removeDomainEntityById(Class clazz, Serializable id) throws DataAccessException;

	/**
	 * 更新存在的数据实体
	 * 
	 * @author odpsoft
	 * @time 2008-10-30
	 * @param clazz
	 *            数据实体对应的领域模型
	 */
	public void updateDomainEntity(Object clazz) throws DataAccessException;

	/**
	 * 
	 * 持久化指定的数据对象,如果该数据不存在于可序列化的ID,将会分配该数据一个指定的ID表识,否则,更新存在的数据
	 * 
	 * @author odpsoft
	 * @time 2008 2008-10-30
	 * @param object
	 *            数据对象
	 * @return 序列化的ID
	 */
	public Serializable saveDomainEntity(Object object) throws DataAccessException;

	/**
	 * 
	 * 根据指定的属性名和属性值获取数据列表,执行等于操作
	 * 
	 * @author odpsoft
	 * @time 2008 2008-10-30
	 * @param clazz
	 *            数据类定义数据
	 * @param propertyName
	 *            属性名
	 * @param propertyValue
	 *            属性值
	 * @return 符合指定查询条件的数据列表(java.util.List(Class))
	 */
	public List findBy(Class clazz, String propertyName, Object propertyValue);

	/**
	 * 
	 * 根据属性名和属性值查询对象,带排序参数.执行等于操作
	 * 
	 * @author odpsoft
	 * @time 2008 2008-10-30
	 * @param clazz
	 *            数据对象的定义class
	 * @param propertyName
	 *            属性名
	 * @param propertyValue
	 *            属性值
	 * @param orderBy
	 *            需要排序的属性名
	 * @param isAsc
	 *            true 为升序,反之降序
	 * @return 符合指定查询条件的数据列表(java.util.List(Class))
	 */
	public List findBy(Class clazz, String propertyName, Object propertyValue, String orderBy, boolean isAsc);

	/**
	 * 
	 * 根据属性名和属性值查询唯一对象.
	 * 
	 * @author odpsoft
	 * @time 2008 2008-10-30
	 * @param clazz
	 *            数据对象的定义Class
	 * @param propertyName
	 *            属性名
	 * @param propertyValue
	 *            属性值
	 * @return 符合条件的唯一对象 or null if not found.
	 */
	public Object findUniqueBy(Class clazz, String propertyName, Object propertyValue);

	/**
	 * 根据keyName＝keyValue，查询得到list然后返回
	 * 
	 * @param Class
	 *            entity
	 * @param String
	 *            keyName
	 * @param Object
	 *            keyValue
	 * @return Object
	 * @throws DataAccessException
	 */
	public List findAllByMapKey(Class clazz, Map keyMap);
	
	/**
	 * 
	 * 根据用户定义的HQL查询.
	 * 
	 * @author odpsoft
	 * @time 2008 2008-10-30
	 * @param hql
	 *            用户定义的HQL
	 * @return java.util.List
	 */
	public List findAllByHQL(String hql);
	
	/**
	 * 
	 * 查找所有的数据
	 * 
	 * @author odpsoft
	 * @time 2008 2008-11-4
	 * @param clazz 数据定义类
	 * @return java.util.List
	 */
	public List findAll(Class clazz);
}
